package com.orange.util;


import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;


/**
 * 生成excel 并导出
 * 
 * @author 高桂松
 *
 * 2015年12月8日
 */
public class PoiModelUtil {

	private static final Logger log = Logger.getLogger(PoiModelUtil.class);
	   
    public void exportXLS(HttpServletResponse response,List<?> list,String filname,Map<String,String>map) throws Exception {  
  
    	log.info("============数据导入excel开始===============");
    	// 1.创建一个 work  
    	HSSFWorkbook workbook = new HSSFWorkbook();  
    	 
        // 2.创建一个 sheet  
        HSSFSheet sheet = workbook.createSheet("sheet");  
  
        // 3.获取实体类的所有属性，返回Field数组  
        Field[] field = list.get(0).getClass().getDeclaredFields();
        // 4.设置所有列宽
        for(int i=0;i<field.length;i++){
        	sheet.setColumnWidth(i, 5000);
        }
        // 5.第一行目录添加
	    HSSFRow row0=sheet.createRow(0);
	    for (int j = 0; j < field.length; j++) {  
            // 获取属性的名字  
            String name = field[j].getName();
            row0.createCell(j).setCellValue(map.get(name));
	    }
	    // 6.遍历对象集合 填充是数据
	    for(int a=0;a<list.size();a++){
	    	HSSFRow row=sheet.createRow(a+1);
	    	for (int j = 0; j < field.length; j++) {  
                // 获取属性的名字  
                String name = field[j].getName();  
                // 将属性的首字符大写，方便构造get，set方法  
                name = name.substring(0, 1).toUpperCase() + name.substring(1);  
                Method m = list.get(a).getClass().getMethod("get" + name);  
                // 调用getter方法获取属性值  
                String value="";
                if("java.util.Date".equals(field[j].getType().getName())){
                	SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                	if(null!=m.invoke(list.get(a))&&!"".equals(m.invoke(list.get(a)))){
                		value=sdf.format(m.invoke(list.get(a)));
                	}else{
                		value=null;
                	}
                	
                }else{
                	value = String.valueOf(m.invoke(list.get(a))) ; 
                }
                row.createCell(j).setCellValue(value);
	    	 }
	    }
        // 7.设置reponse参数  
        String fileName = filname+".xls";
        response.setHeader("Content-Disposition", "inline; filename="  
                + new String(fileName.getBytes("utf-8"), "ISO-8859-1"));  
        // 确保发送的当前文本格式  
        response.setContentType("application/vnd.ms-excel");  
  
        // 8.输出流  
        /*Writer.write(response, sheet);*/
        try {  
            // 输出
            ServletOutputStream outputStream = response.getOutputStream();  
            // 写入  
            sheet.getWorkbook().write(outputStream);  
            // 清除缓存  
            outputStream.flush();  
  
        } catch (Exception e) {  
        	log.error("数据写入失败!");  
        } 
        log.info("============数据导入excel结束===============");
    }  
	
}
